const app = getApp()
import TIM from './im/tim-wx';
import COS from './im/cos-wx-sdk-v5';
var request = require('./request.js');
var isImLogin = false

let options = {
  SDKAppID: 1400411226 // 接入时需要将0替换为您的即时通信应用的 SDKAppID
};
let tim = TIM.create(options); // SDK 实例通常用 tim 表示
// 设置 SDK 日志输出级别，详细分级请参见 setLogLevel 接口的说明
// tim.setLogLevel(0); // 普通级别，日志量较多，接入时建议使用
tim.setLogLevel(1); // release级别，SDK 输出关键信息，生产环境时建议使用
// 将腾讯云对象存储服务 S
/**
  * 
陌滋app后台小程序密码 shijun85686483@
wx0381ce35ac1a82e2
陌滋app imskd 
微信 雨泽(软件开发)
账号昵称 81039365@qq.com
账号ID 100015278625
SDKAppID 1400411226
密钥78992278cece9cd8ff5dc63730575f261504af57667cb8db036ead40ebd49217
  */
const imLogin = () => {
  var token = wx.getStorageSync('token')
  var userId = wx.getStorageSync('userId').toString()
  if (!!token && !!userId) {
    // 创建 SDK 实例，TIM.create() 方法对于同一个 SDKAppID 只会返回同一份实例
    // let options = {
    //   SDKAppID: 1400411226 // 接入时需要将0替换为您的即时通信应用的 SDKAppID
    // };
    // let tim = TIM.create(options); // SDK 实例通常用 tim 表示
    // // 设置 SDK 日志输出级别，详细分级请参见 setLogLevel 接口的说明
    // // tim.setLogLevel(0); // 普通级别，日志量较多，接入时建议使用
    // tim.setLogLevel(1); // release级别，SDK 输出关键信息，生产环境时建议使用
    // // 将腾讯云对象存储服务 SDK （以下简称 COS SDK）注册为插件，IM SDK 发送文件、图片等消息时，需要用到腾讯云的 COS 服务

    // 微信小程序环境，注册 COS SDK
    tim.registerPlugin({
      'cos-wx-sdk': COS
    }); // 微信小程序环境请取消本行注释，并注释掉 tim.registerPlugin({'cos-js-sdk': COS});

    // 腾讯IM获取userSig接口
    var postObj = {
      url: '/user/sig/get',
      method: 'POST',
      data: {
        token: token,
        userId: userId,
      }
    }

    if (isImLogin == false) {
      request.noLoginRequest(postObj).then(res => {
        console.log('腾讯IM获取userSig接口', res)
        var userSig = res.data.data
        console.log(userId, userSig);
        // 开始登录
        tim.login({
          userID: userId,
          userSig: userSig //通过服务端获得
        }).then((imResponse) => {
          console.log('登录成功', imResponse); // 登录成功
          isImLogin = true
          watchMessage()
        }).catch((imError) => {
          console.warn('登录失败的相关信息  login error:', imError); // 登录失败的相关信息
        })
      }).catch(err => {})
    }

    onSdkReady()

  }


}
const imLogout = () => {
  tim.logout();
}
const watchMessage = () => {
  let watchMessage = function (event) {
    // 收到推送的单聊、群聊、群提示、群系统通知的新消息，可通过遍历 event.data 获取消息列表数据并渲染到页面
    // event.name - TIM.EVENT.MESSAGE_RECEIVED
    // event.data - 存储 Message 对象的数组 - [Message]
    // console.log('监听页面', event)

    getConversationList() //拉取会话列表



    // wx.setTabBarBadge({
    //   index: 0,
    //   text: '1'
    // })

    // var message = event.data[0]
    // if (message.type == "TIMCustomElem") {
    //   var extension = JSON.parse(message.payload.extension)
    //   var desc = extension.desc
    //   wx.showModal({
    //     title: '重要提示',
    //     content: desc,
    //     success(res) {
    //       if (res.confirm) {
    //         console.log('用户点击确定')
    //       } else if (res.cancel) {
    //         console.log('用户点击取消')
    //       }
    //     }
    //   })
    // }

  }
  tim.on(TIM.EVENT.MESSAGE_RECEIVED, watchMessage);
}

const onMessageReceived = () => {
  //传当前页面的tim 进来
  let onMessageReceived = function (event) {
    // 收到推送的单聊、群聊、群提示、群系统通知的新消息，可通过遍历 event.data 获取消息列表数据并渲染到页面
    // event.name - TIM.EVENT.MESSAGE_RECEIVED
    // event.data - 存储 Message 对象的数组 - [Message]
  };
  tim.off(TIM.EVENT.MESSAGE_RECEIVED, onMessageReceived);

}

const createTextMessage = (userId, msg) => {
  // 发送文本消息，Web 端与小程序端相同
  // 1. 创建消息实例，接口返回的实例可以上屏
  let message = tim.createTextMessage({
    to: userId,
    conversationType: TIM.TYPES.CONV_C2C,
    // 消息优先级，用于群聊（v2.4.2起支持）。如果某个群的消息超过了频率限制，后台会优先下发高优先级的消息，详细请参考：https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)
    // 支持的枚举值：TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL（默认）, TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
    // priority: TIM.TYPES.MSG_PRIORITY_NORMAL,
    payload: {
      text: msg
    }
  });
  // 2. 发送消息
  let promise = tim.sendMessage(message);
  promise.then(function (imResponse) {
    // 发送成功
    console.log('发送成功', imResponse);
  }).catch(function (imError) {
    // 发送失败
    console.warn('发送失败sendMessage error:', imError);
  });
}


const getConversationList = () => {
  // 拉取会话列表
  //   获取会话列表的接口，该接口会尝试同步最新的100条会话，在同步完成后返回 SDK 内部维护的会话列表。 调用时机：需要刷新会话列表时
  // 注意1：该接口获取的会话列表中的资料是不完整的（仅包括头像、昵称等，能够满足会话列表的渲染需求），若要查询详细会话资料，可参考：getConversationProfile 
  // 注意2：会话保存时长跟会话最后一条消息保存时间一致，消息默认保存7天，即会话默认保存7天。
  let promise = tim.getConversationList();
  promise.then(function (imResponse) {
    const conversationList = imResponse.data.conversationList; // 会话列表，用该列表覆盖原有的会话列表
    // console.log('拉取会话列表', conversationList);


    let pages = getCurrentPages();
    let currPage = null;
    // console.log(pages) 的到一个数组
    if (pages.length) {
      // 获取当前页面的对象（上边所获得的数组中最后一项就是当前页面的对象）
      currPage = pages[pages.length - 1];
    }
    // 获取当前页面的路由
    let route = currPage.route
    // console.log('获取当前页面的路由', route)



    var text = 0
    conversationList.forEach((items, i) => {
      text = items.unreadCount + text
    })

    if (['pages/videoIndex/videoIndex', 'pages/chatRoom/chatRoom', 'pages/game/gameIndex/gameIndex', 'pages/my/my'].includes(route)) {
      wx.setTabBarBadge({
        index: 1,
        text: text.toString()
      })
    }



  }).catch(function (imError) {
    console.warn('getConversationList error:', imError); // 获取会话列表失败的相关信息
  });



}

const getConversationProfile = () => {
  // 获取会话资料的接口，当点击会话列表中的某个会话时，调用该接口获取会话的详细信息。
  let promise = tim.getConversationProfile(conversationID);
  promise.then(function (imResponse) {
    // 获取成功
    console.log(imResponse.data.conversation); // 会话资料
  }).catch(function (imError) {
    console.warn('getConversationProfile error:', imError); // 获取会话资料失败的相关信息
  });
}

const getMessageList = (userId) => {
  var obj
  // 打开某个会话时，第一次拉取消息列表
  let promise = tim.getMessageList({
    conversationID: `C2C${userId}`,
    count: 15
  });
  promise.then(function (imResponse) {
    const messageList = imResponse.data.messageList; // 消息列表。
    const nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉，分页续拉时需传入该字段。
    const isCompleted = imResponse.data.isCompleted; // 表示是否已经拉完所有消息。
    wx.setStorageSync('MessageList', imResponse.data)
  });
  return obj
  // 下拉查看更多消息
  // let promise = tim.getMessageList({conversationID: 'C2Ctest', nextReqMessageID, count: 15});
  // promise.then(function(imResponse) {
  //   const messageList = imResponse.data.messageList; // 消息列表。
  //   const nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉，分页续拉时需传入该字段。
  //   const isCompleted = imResponse.data.isCompleted; // 表示是否已经拉完所有消息。
  // });
}
  
const setMessageRead = (conversationID) => {
  // 将某会话下所有未读消息已读上报
  let promise = tim.setMessageRead({
    conversationID: conversationID
  });
  promise.then(function (imResponse) {
    // 已读上报成功，指定 ID 的会话的 unreadCount 属性值被置为0
  }).catch(function (imError) {
    // 已读上报失败
    console.warn('setMessageRead error:', imError);
  });
}

const onSdkReady = () => {
  let onSdkReady = function (event) {
    getConversationList()
  };
  tim.on(TIM.EVENT.SDK_READY, onSdkReady);
}



module.exports = {
  TIM: TIM,
  tim: tim,
  isImLogin:isImLogin,
  /**
   * //登陆
   * 用户登录 IM SDK 才能正常收发消息，登录需要用户提供 UserID、UserSig 等信息，具体含义请参见 登录鉴权。登录成功后，需要先等 SDK 处于 ready 状态才能调用 sendMessage 等需要鉴权的接口，您可以通过监听事件 TIM.EVENT.SDK_READY 获取 SDK 状态。
   */
  imLogin: imLogin,
  /**
   * 登出
   * 登出即时通信 IM，通常在切换帐号的时候调用，清除登录态以及内存中的所有数据。
   */
  imLogout: imLogout,
  /**
   * 收到推送的单聊、群聊、群提示、群系统通知的新消息，可通过遍历 event.data 获取消息列表数据并渲染到页面
   */
  watchMessage: watchMessage,
  /**
   * setMessageRead  取消监听
   */
  onMessageReceived: onMessageReceived,
  /**
   * 发送文本消息，
   */
  createTextMessage: createTextMessage,
  /**
   * 拉取会话列表
   */
  getConversationList: getConversationList,
  /**
   * 获取会话资料的接口
   */
  getConversationProfile: getConversationProfile,
  /**
   * 拉取消息列表 */
  getMessageList: getMessageList,
  /**
   * // 将某会话下所有未读消息已读上报
   */
  setMessageRead: setMessageRead,
  /**
   * SDK 进入 ready 状态时触发，接入侧监听此事件，然后可调用 SDK 发送消息等API，使用 SDK 的各项功能
      注意：login 成功才会驱动 SDK 触发 SDK_READY 事件

   */
  onSdkReady: onSdkReady,

}